{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a = tf.Variable(np.ones(10), dtype=tf.float32,name='a')\n",
    "b = tf.Variable(np.ones(10) * 2, dtype=tf.float32,name='b')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "c = a * b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tensor(\"mul_1:0\", shape=(10,), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "print (c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.5.0'"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from tensorflow.examples.tutorials.mnist import input_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets('.', one_hot=True)\n",
    "mnist2 = input_data.read_data_sets('.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]\n",
      " [ 0.  0.  0.  1.  0.  0.  0.  0.  0.  0.]]\n",
      "[7 3]\n"
     ]
    }
   ],
   "source": [
    "print(mnist.train.labels[:2])\n",
    "print(mnist2.train.labels[:2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#\n",
    "#   Homework_One: import numpy as np\n",
    "#"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# read_data from mnist\n",
    "# 训练数据大小为:\n",
    "# (55000,784)\n",
    "# 训练标签大小:\n",
    "# (55000,)\n",
    "# 验证集图像大小:\n",
    "# (5000, 784)\n",
    "# 验证集图像标签大小：\n",
    "# (5000,)\n",
    "# 测试标签图像大小：\n",
    "# (10000,784)\n",
    "# 测试标签大小:\n",
    "# (10000,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#\n",
    "# 两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "# 多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空\n",
    "# "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "L1_units_count = 512"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "L2_units_count = 256 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2\n",
    "output_2 = tf.nn.relu(logits_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "L3_units_count = 128\n",
    "W_3 = tf.Variable(initialize([L2_units_count, L3_units_count]))\n",
    "b_3 = tf.Variable(initialize([L3_units_count]))\n",
    "logits_3 = tf.matmul(output_2, W_3) + b_3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "logits = logits_3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 64\n",
    "trainig_step = 8000\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.431591, the validation accuracy is 0.9008\n",
      "after 200 training steps, the loss is 0.216663, the validation accuracy is 0.9206\n",
      "after 300 training steps, the loss is 0.210293, the validation accuracy is 0.9178\n",
      "after 400 training steps, the loss is 0.165988, the validation accuracy is 0.9426\n",
      "after 500 training steps, the loss is 0.201616, the validation accuracy is 0.9484\n",
      "after 600 training steps, the loss is 0.142975, the validation accuracy is 0.948\n",
      "after 700 training steps, the loss is 0.0980068, the validation accuracy is 0.9492\n",
      "after 800 training steps, the loss is 0.104442, the validation accuracy is 0.9556\n",
      "after 900 training steps, the loss is 0.069474, the validation accuracy is 0.9572\n",
      "after 1000 training steps, the loss is 0.0380673, the validation accuracy is 0.9608\n",
      "after 1100 training steps, the loss is 0.325295, the validation accuracy is 0.9596\n",
      "after 1200 training steps, the loss is 0.0756251, the validation accuracy is 0.9546\n",
      "after 1300 training steps, the loss is 0.0876991, the validation accuracy is 0.9644\n",
      "after 1400 training steps, the loss is 0.165485, the validation accuracy is 0.9632\n",
      "after 1500 training steps, the loss is 0.134319, the validation accuracy is 0.965\n",
      "after 1600 training steps, the loss is 0.334686, the validation accuracy is 0.9634\n",
      "after 1700 training steps, the loss is 0.105771, the validation accuracy is 0.9698\n",
      "after 1800 training steps, the loss is 0.0724191, the validation accuracy is 0.9698\n",
      "after 1900 training steps, the loss is 0.0670786, the validation accuracy is 0.9686\n",
      "after 2000 training steps, the loss is 0.0379446, the validation accuracy is 0.9676\n",
      "after 2100 training steps, the loss is 0.105473, the validation accuracy is 0.9674\n",
      "after 2200 training steps, the loss is 0.0918226, the validation accuracy is 0.968\n",
      "after 2300 training steps, the loss is 0.0478713, the validation accuracy is 0.9674\n",
      "after 2400 training steps, the loss is 0.0399846, the validation accuracy is 0.9706\n",
      "after 2500 training steps, the loss is 0.0453841, the validation accuracy is 0.97\n",
      "after 2600 training steps, the loss is 0.0793733, the validation accuracy is 0.973\n",
      "after 2700 training steps, the loss is 0.170724, the validation accuracy is 0.9746\n",
      "after 2800 training steps, the loss is 0.0180044, the validation accuracy is 0.9714\n",
      "after 2900 training steps, the loss is 0.0578211, the validation accuracy is 0.9732\n",
      "after 3000 training steps, the loss is 0.137391, the validation accuracy is 0.9724\n",
      "after 3100 training steps, the loss is 0.0331216, the validation accuracy is 0.9722\n",
      "after 3200 training steps, the loss is 0.0971506, the validation accuracy is 0.9748\n",
      "after 3300 training steps, the loss is 0.0477152, the validation accuracy is 0.975\n",
      "after 3400 training steps, the loss is 0.0141089, the validation accuracy is 0.9756\n",
      "after 3500 training steps, the loss is 0.0782345, the validation accuracy is 0.974\n",
      "after 3600 training steps, the loss is 0.0896835, the validation accuracy is 0.9748\n",
      "after 3700 training steps, the loss is 0.122759, the validation accuracy is 0.973\n",
      "after 3800 training steps, the loss is 0.0434547, the validation accuracy is 0.9754\n",
      "after 3900 training steps, the loss is 0.0309274, the validation accuracy is 0.973\n",
      "after 4000 training steps, the loss is 0.0249471, the validation accuracy is 0.975\n",
      "after 4100 training steps, the loss is 0.0278116, the validation accuracy is 0.9762\n",
      "after 4200 training steps, the loss is 0.0317693, the validation accuracy is 0.9766\n",
      "after 4300 training steps, the loss is 0.102974, the validation accuracy is 0.9772\n",
      "after 4400 training steps, the loss is 0.0579842, the validation accuracy is 0.977\n",
      "after 4500 training steps, the loss is 0.0647308, the validation accuracy is 0.9746\n",
      "after 4600 training steps, the loss is 0.0141198, the validation accuracy is 0.9758\n",
      "after 4700 training steps, the loss is 0.0299657, the validation accuracy is 0.9768\n",
      "after 4800 training steps, the loss is 0.00648715, the validation accuracy is 0.9748\n",
      "after 4900 training steps, the loss is 0.0552065, the validation accuracy is 0.9752\n",
      "after 5000 training steps, the loss is 0.0220039, the validation accuracy is 0.9784\n",
      "after 5100 training steps, the loss is 0.0361116, the validation accuracy is 0.9778\n",
      "after 5200 training steps, the loss is 0.0155505, the validation accuracy is 0.979\n",
      "after 5300 training steps, the loss is 0.0600125, the validation accuracy is 0.9776\n",
      "after 5400 training steps, the loss is 0.0198415, the validation accuracy is 0.9774\n",
      "after 5500 training steps, the loss is 0.0248268, the validation accuracy is 0.9796\n",
      "after 5600 training steps, the loss is 0.0172425, the validation accuracy is 0.9768\n",
      "after 5700 training steps, the loss is 0.0850286, the validation accuracy is 0.9788\n",
      "after 5800 training steps, the loss is 0.0205655, the validation accuracy is 0.9792\n",
      "after 5900 training steps, the loss is 0.023629, the validation accuracy is 0.9794\n",
      "after 6000 training steps, the loss is 0.0166069, the validation accuracy is 0.9778\n",
      "after 6100 training steps, the loss is 0.00480547, the validation accuracy is 0.9788\n",
      "after 6200 training steps, the loss is 0.0975429, the validation accuracy is 0.9762\n",
      "after 6300 training steps, the loss is 0.0121983, the validation accuracy is 0.9798\n",
      "after 6400 training steps, the loss is 0.0131769, the validation accuracy is 0.9786\n",
      "after 6500 training steps, the loss is 0.00503147, the validation accuracy is 0.9798\n",
      "after 6600 training steps, the loss is 0.0142949, the validation accuracy is 0.9802\n",
      "after 6700 training steps, the loss is 0.00782886, the validation accuracy is 0.98\n",
      "after 6800 training steps, the loss is 0.011105, the validation accuracy is 0.981\n",
      "after 6900 training steps, the loss is 0.0131297, the validation accuracy is 0.9788\n",
      "after 7000 training steps, the loss is 0.0260145, the validation accuracy is 0.977\n",
      "after 7100 training steps, the loss is 0.0149027, the validation accuracy is 0.9798\n",
      "after 7200 training steps, the loss is 0.0128714, the validation accuracy is 0.981\n",
      "after 7300 training steps, the loss is 0.0205144, the validation accuracy is 0.9784\n",
      "after 7400 training steps, the loss is 0.00816872, the validation accuracy is 0.9806\n",
      "after 7500 training steps, the loss is 0.0045391, the validation accuracy is 0.9792\n",
      "after 7600 training steps, the loss is 0.00341393, the validation accuracy is 0.9802\n",
      "after 7700 training steps, the loss is 0.00226519, the validation accuracy is 0.9806\n",
      "after 7800 training steps, the loss is 0.00213928, the validation accuracy is 0.9808\n",
      "after 7900 training steps, the loss is 0.0127874, the validation accuracy is 0.9808\n",
      "the training is finish!\n",
      "('the test accuarcy is:', 0.97820002)\n"
     ]
    }
   ],
   "source": [
    "lr = 1\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        if trainig_step > 3000:\n",
    "            lr = 0.8\n",
    "        if trainig_step > 4000:\n",
    "            lr = 0.6\n",
    "        if trainig_step > 5000:\n",
    "            lr = 0.4\n",
    "        if trainig_step >= 6000:\n",
    "            lr = 0.2\n",
    "        if trainig_step >= 7000:\n",
    "            lr = 0.1\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: lr\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-7900\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n8Q37TfDic2v9L6bynt3Q0lo+pebbXlz3tKqBzzu+WY+Yyicq6zIb1PfiwnHVvPi19g9a+VYXZntx\n7YxJXtwyqzoCDZkcmLTmnK1evPLRKlbaP+6+0ovrP/NtcPm0myU3d/fi+f0e9eJBS4618q27q7UX\nt50wNfUVK2O4J0xERBQSdsJEREQh4XB0hIzunb144T/N0ZZfHf2wla9h5nfmOUn4LXNB7eURjwQP\nQRNVRIsfMVMyizo960uxh5kbZZp4VH4HL561yZ7SWbGlTuBrZYo5JvfDju9HLRsAxo34jxdfsuAK\nKy1jymxQsB2NdkV9fO5X7a3l1hMq9zA/94SJiIhCwk6YiIgoJOyEiYiIQsI54QhbWtf04sXHPulL\nqbZ75gQ9lW+uivXyrwfEVUZt/Jys6lR4Gfuaqyttb2JfXWnZQHNVsr/3+s5K26lmovCLF83Vm5p+\nucHKp9/PS0o9Kws9uLu1PO6Qp31L5qtpwjZ7Tvje4UO8uOa8tSbhz7+sfBnrfwt+7QzTph0euMyL\n55/+mJWvbXauF28bsdFKqz3UXBlv16rVga9VWWXn7vDiTUUmbvlpQRjVKbO4J0xERBQSdsJEREQh\nqbDD0VnNm1nLC65v7sWNvzFDj7Veta/QklGgXrx4pxlC+W2XfbpDi6x8Lx764xArbf0Cc+Wfxt+Z\n8up8Yw+P6ebNXlw7n8PKyaC997WWl1xu4lcOfsaLe1SJOBclVsPNBf63XbvDShqdb4a7R83pY6W1\nv2CBFxdtt6+wVlntrG1fnWrfKubrqAhmuxn+3PlWvhZvf+PFhYhTkXlmu6vNd0DnKvZpSHNPesSL\nv+z2ppXWu78Zxq79EoejM9u1tpbnHT7Gi69ceaTJ98UskME9YSIiopCwEyYiIgoJO2EiIqKQVKg5\n4cw6tb2414dLrbR3Grznxb1n2PM+fjkfmdNThh831IsL5y2yX6uzufRavUW/WGn1ihZHLTv6Rdwo\nHkWHmrnfZWZqDh/2fsLK1zbLf2qZmQf+dJt9ytlN8wd6cf5ye/7/x4HmtJVbVpu7Z93fZIaVr3s1\ncxPyB3uNs9JuvHqoFze/5xsQUFhVAtP2+WaoF7e8K33vV/vLp1nLH/Q3N5k/LXedlZZ/4hYvrv1S\nautVHiwaGXyZ0HQqONac7rmpRXAX13CmfcqZzgznFEPuCRMREYWEnTAREVFIyvVwdEZV+05DBW+a\n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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-65-5aaa30e33b0f>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-65-5aaa30e33b0f>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m    以作业提供的参数运行出来的结果，只看上面几个数字还是很不错的，但是总体准确率不太理想。\u001b[0m\n\u001b[0m    ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "以作业提供的参数运行出来的结果，只看上面几个数字还是很不错的，但是总体准确率不太理想。\n",
    "1）、对模型结构的理解：我们这里定义了一个双层神经元网络，首先定义模型的输入（这里我们直接采用直接使用上面的数据作为输入），后定义模型的权重W1和W2（高斯分布的随机分布来初始化权重矩阵）和偏置bias1和bias2，有了这些参数就可以计算为经激活的logits，这里是计算图所以是没有具体参数的，基于这些条件还需要给模型添加lable，这里为了高效运行将图像和lable这两种，多个数据会被组织成一个batch送入网络，还定义了交叉熵的损失以及优化器和accuracy等变量评估模型效果。\n",
    "2）、模型的训练过程：首先我们定义算法公式，然后定义loss（交叉熵损失等），选择合适的优化器来让loss最小，对数据进行迭代训练，目的还是让loss达到最小，最后在测试集或者验证集上对准确率进行评估。\n",
    "3）、对计算图的理解：tensorflow的程序一般分为两个阶段,1、计算图的计算；2、在session中执行计算，简单来说计算图就是为了定义网络的结构的，计算图可以通过命令来查看grap.as_graph_def()，运行这句命令可以看出我们的计算图中包含了许多的node（计算节点，类似jason格式），抽象点理解有点类似c语言中声明一个函数，具体调用时候需要赋予实参（session中运算）。\n",
    "4）、这里的效果为什么差：首先跟我们的模型训练的次数比较少，还没有训练处一个足够好的模型，我将1000次提高到9000，效果有明显变化，其次我们还可以通过调整学习率来试验。（最近加班调休时间比较紧张，作业做的比较仓促，但是通过本次作业还是对tensorflow生成神经网络模型有了很多理解，模型训练的过程中调参是个很耗时间的工作，等放假时间充裕还会对作业多投入精力去继续学习）\n",
    "进阶作业：\n",
    "1、评分达到98以上，这里得出1.0的结果感觉可能有些问题，时间关系没来得及细查。\n",
    "2、调整隐层的数量：将两层去掉一层，即用的单层神经网络，得到的正确率在0.93左右，次数为3000次，学习率也有动态分配，感觉单层神经网络不是很理想。\n",
    "3、调节神经元的个数：将神经元由100调整到10，正确率下降，模型训练的效果不好，0.934的正确率，非常不理想。\n",
    "4、在模型添加正则：时间关系没来得及做。\n",
    "5、不同初始化方式同样也没来得及做，放假时间充裕将参数再好好调整，再训练模型试试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 1.对于模型结构的理解\n",
    "# 一个是双层的神经网络分别为 w1 b1, w2, b2, 定义初始化参数，经过激活的logits。定义网络结构参数设置\n",
    "# 2.模型训练：\n",
    "# 定义loss function，训练模型损失函数，选择合适的有优化方程是loss最小，在测试集上评估模型，\n",
    "# 3.对计算图的理解：\n",
    "#tensorflow的程序一般分为两个阶段,1、计算图的计算；2、在session中执行计算，简单来说计算图就是为了定义网络的结构的，计算图可以通过命令来查看grap.as_graph_def()，运行这句命令可以看出我们的计算图中包含了许多的node（计算节点，类似jason格式），抽象点理解有点类似c语言中声明一个函数，具体调用时候需要赋予实参（session中运算）。\n",
    "# 4.基础作业效果差。\n",
    "# 一个是迭代次数少；第二个学习率需要调优；第三个batch size需要适当的调优；第四网络结构需要加深；第五每一层隐含层的神经元个数需要增加"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "进阶作业：\n",
    "1、通过基础作业的效果差的结果做了如下的调整：\n",
    "2、加了一层网络结构，修改隐含层的神经元的大小，512，256，128，学习更加准确\n",
    "3、增加迭代次数\n",
    "4、优化学习率\n",
    "5、优化方程有待学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [],
   "source": [
    "#进阶作业结果：\n",
    "#训练集准确率能达到 the loss is 0.0127874, the validation accuracy is 0.9808\n",
    "#测试集基本上为100%识别图片"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
